package main

import "fmt"

// go 中的运算符
// *      /      %      <<       >>     &       &^
// +      -      |      ^
// ==     !=     <      <=       >      >=
// &&
// ||
//
// 二元运算符有五种优先级。在同一个优先级，使用左优先结合规则，
//  但是使用括号可以明确优先顺序，使用括号也可以用于提升优先级，
// 例如mask & (1 << 28)。
//
//	&      位运算 AND
//	|      位运算 OR
//	^      位运算 XOR
//	&^     位清空（AND NOT）
//	<<     左移
//	>>     右移
//
func main() {

	var x uint8 = 1<<1 | 1<<5
	var y uint8 = 1<<1 | 1<<2

	fmt.Printf("%08b\n", x) // "00100010", the set {1, 5}
	fmt.Printf("%08b\n", y) // "00000110", the set {1, 2}

	fmt.Printf("%08b\n", x&y)  // "00000010", the intersection {1}
	fmt.Printf("%08b\n", x|y)  // "00100110", the union {1, 2, 5}
	fmt.Printf("%08b\n", x^y)  // "00100100", the symmetric difference {2, 5}
	fmt.Printf("%08b\n", x&^y) // "00100000", the difference {5}

}
